package com.msb.blob;

import java.util.ArrayList;
import java.util.List;

/**
 *volatile并不能保证多个线程共同修改running变量时所带来的不一致问题，
 * 也就是说volatile不能替代synchronized
 */
public class T8 {
    volatile int count = 0;
    void m() {
        for(int i=0;i<10000; i++) count++;
    }

    public static void main(String[] args) {
        T8 t = new T8();
        List<Thread> threads = new ArrayList<Thread>();

        for (int i=0; i<10; i++) {
            threads.add(new Thread(t::m, "thread-"+i));
        }
        threads.forEach((o)->o.start());
        threads.forEach((o)->{
            try {
                o.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(t.count);
    }
}

//volatile和synchronized区别？
//volatile只保证可见性，并不保证原子性；
//synchronized既保证可见性，又保证原子性，但效率要比volatile低不少
//如果只需要保证可见性，使用volatile,不要使用synchronized
//Thread.join()方法简单解释：插队，等待该线程完成后执行该线程